/*!
 * artDialog 4.1.6
 * Date: 2012-07-16 22:57
 * http://code.google.com/p/artdialog/
 * (c) 2009-2012 TangBin, http://www.planeArt.cn
 *
 * This is licensed under the GNU LGPL, version 2.1 or later.
 * For details, see: http://creativecommons.org/licenses/LGPL/2.1/
 */

;(function ($, window, undefined) {

    $.noop = $.noop || function () {
        }; // jQuery 1.3.2
    var _box, _thisScript, _skin, _path,
        _count = 0,
        _$window = $(window),
        _$document = $(document),
        _$html = $('html'),
        _elem = document.documentElement,
        _isIE6 = window.VBArray && !window.XMLHttpRequest,
        _isMobile = 'createTouch' in document && !('onmousemove' in _elem)
            || /(iPhone|iPad|iPod)/i.test(navigator.userAgent),
        _expando = 'artDialog' + +new Date;

    var artDialog = function (config, ok, cancel) {
        config = config || {};

        if (typeof config === 'string' || config.nodeType === 1) {
            config = {content: config, fixed: !_isMobile};
        }
        ;

        var api,
            defaults = artDialog.defaults,
            elem = config.follow = this.nodeType === 1 && this || config.follow;

        // 合并默认配置
        for (var i in defaults) {
            if (config[i] === undefined) config[i] = defaults[i];
        }
        ;

        // 兼容v4.1.0之前的参数，未来版本将删除此
        $.each({ok: "yesFn", cancel: "noFn", close: "closeFn", init: "initFn", okVal: "yesText", cancelVal: "noText"},
            function (i, o) {
                config[i] = config[i] !== undefined ? config[i] : config[o]
            });

        // 返回跟随模式或重复定义的ID
        if (typeof elem === 'string') elem = $(elem)[0];
        config.id = elem && elem[_expando + 'follow'] || config.id || _expando + _count;
        api = artDialog.list[config.id];
        if (elem && api) return api.follow(elem).zIndex().focus();
        if (api) return api.zIndex().focus();

        // 目前主流移动设备对fixed支持不好
        if (_isMobile) config.fixed = false;

        // 按钮队列
        if (!$.isArray(config.button)) {
            config.button = config.button ? [config.button] : [];
        }
        ;
        if (ok !== undefined) config.ok = ok;
        if (cancel !== undefined) config.cancel = cancel;
        config.ok && config.button.push({
            name: config.okVal,
            callback: config.ok,
            focus: true
        });
        config.cancel && config.button.push({
            name: config.cancelVal,
            callback: config.cancel
        });

        // zIndex全局配置
        artDialog.defaults.zIndex = config.zIndex;

        _count++;

        return artDialog.list[config.id] = _box ?
            _box._init(config) : new artDialog.fn._init(config);
    };

    artDialog.fn = artDialog.prototype = {

        version: '4.1.6',

        closed: true,

        _init: function (config) {
            var that = this, DOM,
                icon = config.icon,
                iconBg = icon && (_isIE6 ? {png: 'icons/' + icon + '.png'}
                        : {backgroundImage: 'url(\'' + config.path + '/skins/icons/' + icon + '.png\')'});

            that.closed = false;
            that.config = config;
            that.DOM = DOM = that.DOM || that._getDOM();

            DOM.wrap.addClass(config.skin);
            DOM.close[config.cancel === false ? 'hide' : 'show']();
            DOM.icon[0].style.display = icon ? '' : 'none';
            DOM.iconBg.css(iconBg || {background: 'none'});
            DOM.se.css('cursor', config.resize ? 'se-resize' : 'auto');
            DOM.title.css('cursor', config.drag ? 'move' : 'auto');
            DOM.content.css('padding', config.padding);

            that[config.show ? 'show' : 'hide'](true)
            that.button(config.button)
                .title(config.title)
                .content(config.content, true)
                .size(config.width, config.height)
                .time(config.time);

            config.follow
                ? that.follow(config.follow)
                : that.position(config.left, config.top);

            that.zIndex().focus();
            config.lock && that.lock();

            that._addEvent();
            that._ie6PngFix();
            _box = null;

            config.init && config.init.call(that, window);
            return that;
        },

        /**
         * 设置内容
         * @param    {String, HTMLElement}    内容 (可选)
         * @return    {this, HTMLElement}        如果无参数则返回内容容器DOM对象
         */
        content: function (msg) {
            var prev, next, parent, display,
                that = this,
                DOM = that.DOM,
                wrap = DOM.wrap[0],
                width = wrap.offsetWidth,
                height = wrap.offsetHeight,
                left = parseInt(wrap.style.left),
                top = parseInt(wrap.style.top),
                cssWidth = wrap.style.width,
                $content = DOM.content,
                content = $content[0];

            that._elemBack && that._elemBack();
            wrap.style.width = 'auto';

            if (msg === undefined) return content;
            if (typeof msg === 'string') {
                $content.html(msg);
            } else if (msg && msg.nodeType === 1) {

                // 让传入的元素在对话框关闭后可以返回到原来的地方
                display = msg.style.display;
                prev = msg.previousSibling;
                next = msg.nextSibling;
                parent = msg.parentNode;
                that._elemBack = function () {
                    if (prev && prev.parentNode) {
                        prev.parentNode.insertBefore(msg, prev.nextSibling);
                    } else if (next && next.parentNode) {
                        next.parentNode.insertBefore(msg, next);
                    } else if (parent) {
                        parent.appendChild(msg);
                    }
                    ;
                    msg.style.display = display;
                    that._elemBack = null;
                };

                $content.html('');
                content.appendChild(msg);
                msg.style.display = 'block';

            }
            ;

            // 新增内容后调整位置
            if (!arguments[1]) {
                if (that.config.follow) {
                    that.follow(that.config.follow);
                } else {
                    width = wrap.offsetWidth - width;
                    height = wrap.offsetHeight - height;
                    left = left - width / 2;
                    top = top - height / 2;
                    wrap.style.left = Math.max(left, 0) + 'px';
                    wrap.style.top = Math.max(top, 0) + 'px';
                }
                ;
                if (cssWidth && cssWidth !== 'auto') {
                    wrap.style.width = wrap.offsetWidth + 'px';
                }
                ;
                that._autoPositionType();
            }
            ;

            that._ie6SelectFix();
            that._runScript(content);

            return that;
        },

        /**
         * 设置标题
         * @param    {String, Boolean}    标题内容. 为false则隐藏标题栏
         * @return    {this, HTMLElement}    如果无参数则返回内容器DOM对象
         */
        title: function (text) {
            var DOM = this.DOM,
                wrap = DOM.wrap,
                title = DOM.title,
                className = 'aui_state_noTitle';

            if (text === undefined) return title[0];
            if (text === false) {
                title.hide().html('');
                wrap.addClass(className);
            } else {
                title.show().html(text || '');
                wrap.removeClass(className);
            }
            ;

            return this;
        },

        /**
         * 位置(相对于可视区域)
         * @param    {Number, String}
         * @param    {Number, String}
         */
        position: function (left, top) {
            var that = this,
                config = that.config,
                wrap = that.DOM.wrap[0],
                isFixed = _isIE6 ? false : config.fixed,
                ie6Fixed = _isIE6 && that.config.fixed,
                docLeft = _$document.scrollLeft(),
                docTop = _$document.scrollTop(),
                dl = isFixed ? 0 : docLeft,
                dt = isFixed ? 0 : docTop,
                ww = _$window.width(),
                wh = _$window.height(),
                ow = wrap.offsetWidth,
                oh = wrap.offsetHeight,
                style = wrap.style;

            if (left || left === 0) {
                that._left = left.toString().indexOf('%') !== -1 ? left : null;
                left = that._toNumber(left, ww - ow);

                if (typeof left === 'number') {
                    left = ie6Fixed ? (left += docLeft) : left + dl;
                    style.left = Math.max(left, dl) + 'px';
                } else if (typeof left === 'string') {
                    style.left = left;
                }
                ;
            }
            ;

            if (top || top === 0) {
                that._top = top.toString().indexOf('%') !== -1 ? top : null;
                top = that._toNumber(top, wh - oh);

                if (typeof top === 'number') {
                    top = ie6Fixed ? (top += docTop) : top + dt;
                    style.top = Math.max(top, dt) + 'px';
                } else if (typeof top === 'string') {
                    style.top = top;
                }
                ;
            }
            ;

            if (left !== undefined && top !== undefined) {
                that._follow = null;
                that._autoPositionType();
            }
            ;

            return that;
        },

        /**
         *    尺寸
         *    @param    {Number, String}    宽度
         *    @param    {Number, String}    高度
         */
        size: function (width, height) {
            var maxWidth, maxHeight, scaleWidth, scaleHeight,
                that = this,
                config = that.config,
                DOM = that.DOM,
                wrap = DOM.wrap,
                main = DOM.main,
                wrapStyle = wrap[0].style,
                style = main[0].style;

            if (width) {
                that._width = width.toString().indexOf('%') !== -1 ? width : null;
                maxWidth = _$window.width() - wrap[0].offsetWidth + main[0].offsetWidth;
                scaleWidth = that._toNumber(width, maxWidth);
                width = scaleWidth;

                if (typeof width === 'number') {
                    wrapStyle.width = 'auto';
                    style.width = Math.max(that.config.minWidth, width) + 'px';
                    wrapStyle.width = wrap[0].offsetWidth + 'px'; // 防止未定义宽度的表格遇到浏览器右边边界伸缩
                } else if (typeof width === 'string') {
                    style.width = width;
                    width === 'auto' && wrap.css('width', 'auto');
                }
                ;
            }
            ;

            if (height) {
                that._height = height.toString().indexOf('%') !== -1 ? height : null;
                maxHeight = _$window.height() - wrap[0].offsetHeight + main[0].offsetHeight;
                scaleHeight = that._toNumber(height, maxHeight);
                height = scaleHeight;

                if (typeof height === 'number') {
                    style.height = Math.max(that.config.minHeight, height) + 'px';
                } else if (typeof height === 'string') {
                    style.height = height;
                }
                ;
            }
            ;

            that._ie6SelectFix();

            return that;
        },

        /**
         * 跟随元素
         * @param    {HTMLElement, String}
         */
        follow: function (elem) {
            var $elem, that = this, config = that.config;

            if (typeof elem === 'string' || elem && elem.nodeType === 1) {
                $elem = $(elem);
                elem = $elem[0];
            }
            ;

            // 隐藏元素不可用
            if (!elem || !elem.offsetWidth && !elem.offsetHeight) {
                return that.position(that._left, that._top);
            }
            ;

            var expando = _expando + 'follow',
                winWidth = _$window.width(),
                winHeight = _$window.height(),
                docLeft = _$document.scrollLeft(),
                docTop = _$document.scrollTop(),
                offset = $elem.offset(),
                width = elem.offsetWidth,
                height = elem.offsetHeight,
                isFixed = _isIE6 ? false : config.fixed,
                left = isFixed ? offset.left - docLeft : offset.left,
                top = isFixed ? offset.top - docTop : offset.top,
                wrap = that.DOM.wrap[0],
                style = wrap.style,
                wrapWidth = wrap.offsetWidth,
                wrapHeight = wrap.offsetHeight,
                setLeft = left - (wrapWidth - width) / 2,
                setTop = top + height,
                dl = isFixed ? 0 : docLeft,
                dt = isFixed ? 0 : docTop;

            setLeft = setLeft < dl ? left :
                (setLeft + wrapWidth > winWidth) && (left - wrapWidth > dl)
                    ? left - wrapWidth + width
                    : setLeft;

            setTop = (setTop + wrapHeight > winHeight + dt)
            && (top - wrapHeight > dt)
                ? top - wrapHeight
                : setTop;

            style.left = setLeft + 'px';
            style.top = setTop + 'px';

            that._follow && that._follow.removeAttribute(expando);
            that._follow = elem;
            elem[expando] = config.id;
            that._autoPositionType();
            return that;
        },

        /**
         * 自定义按钮
         * @example
         button({
			name: 'login',
			callback: function () {},
			disabled: false,
			focus: true
		}, .., ..)
         */
        button: function () {
            var that = this,
                ags = arguments,
                DOM = that.DOM,
                buttons = DOM.buttons,
                elem = buttons[0],
                strongButton = 'aui_state_highlight',
                listeners = that._listeners = that._listeners || {},
                list = $.isArray(ags[0]) ? ags[0] : [].slice.call(ags);

            if (ags[0] === undefined) return elem;
            $.each(list, function (i, val) {
                var name = val.name,
                    isNewButton = !listeners[name],
                    button = !isNewButton ?
                        listeners[name].elem :
                        document.createElement('button');

                if (!listeners[name]) listeners[name] = {};
                if (val.callback) listeners[name].callback = val.callback;
                if (val.className) button.className = val.className;
                if (val.focus) {
                    that._focus && that._focus.removeClass(strongButton);
                    that._focus = $(button).addClass(strongButton);
                    that.focus();
                }
                ;

                // Internet Explorer 的默认类型是 "button"，
                // 而其他浏览器中（包括 W3C 规范）的默认值是 "submit"
                // @see http://www.w3school.com.cn/tags/att_button_type.asp
                button.setAttribute('type', 'button');

                button[_expando + 'callback'] = name;
                button.disabled = !!val.disabled;

                if (isNewButton) {
                    button.innerHTML = name;
                    listeners[name].elem = button;
                    elem.appendChild(button);
                }
                ;
            });

            buttons[0].style.display = list.length ? '' : 'none';

            that._ie6SelectFix();
            return that;
        },

        /** 显示对话框 */
        show: function () {
            this.DOM.wrap.show();
            !arguments[0] && this._lockMaskWrap && this._lockMaskWrap.show();
            return this;
        },

        /** 隐藏对话框 */
        hide: function () {
            this.DOM.wrap.hide();
            !arguments[0] && this._lockMaskWrap && this._lockMaskWrap.hide();
            return this;
        },

        /** 关闭对话框 */
        close: function () {
            if (this.closed) return this;

            var that = this,
                DOM = that.DOM,
                wrap = DOM.wrap,
                list = artDialog.list,
                fn = that.config.close,
                follow = that.config.follow;

            that.time();
            if (typeof fn === 'function' && fn.call(that, window) === false) {
                return that;
            }
            ;

            that.unlock();

            // 置空内容
            that._elemBack && that._elemBack();
            wrap[0].className = wrap[0].style.cssText = '';
            DOM.title.html('');
            DOM.content.html('');
            DOM.buttons.html('');

            if (artDialog.focus === that) artDialog.focus = null;
            if (follow) follow.removeAttribute(_expando + 'follow');
            delete list[that.config.id];
            that._removeEvent();
            that.hide(true)._setAbsolute();

            // 清空除this.DOM之外临时对象，恢复到初始状态，以便使用单例模式
            for (var i in that) {
                if (that.hasOwnProperty(i) && i !== 'DOM') delete that[i];
            }
            ;

            // 移除HTMLElement或重用
            _box ? wrap.remove() : _box = that;

            return that;
        },

        /**
         * 定时关闭
         * @param    {Number}    单位为秒, 无参数则停止计时器
         */
        time: function (second) {
            var that = this,
                cancel = that.config.cancelVal,
                timer = that._timer;

            timer && clearTimeout(timer);

            if (second) {
                that._timer = setTimeout(function () {
                    that._click(cancel);
                }, 1000 * second);
            }
            ;

            return that;
        },

        /** 设置焦点 */
        focus: function () {
            try {
                var elem = this._focus && this._focus[0] || this.DOM.close[0];
                elem && elem.focus();
            } catch (e) {
            }
            ; // IE对不可见元素设置焦点会报错
            return this;
        },

        /** 置顶对话框 */
        zIndex: function () {
            var that = this,
                DOM = that.DOM,
                wrap = DOM.wrap,
                top = artDialog.focus,
                index = artDialog.defaults.zIndex++;

            // 设置叠加高度
            wrap.css('zIndex', index);
            that._lockMask && that._lockMask.css('zIndex', index - 1);

            // 设置最高层的样式
            top && top.DOM.wrap.removeClass('aui_state_focus');
            artDialog.focus = that;
            wrap.addClass('aui_state_focus');

            return that;
        },

        /** 设置屏锁 */
        lock: function () {
            if (this._lock) return this;

            var that = this,
                index = artDialog.defaults.zIndex - 1,
                wrap = that.DOM.wrap,
                config = that.config,
                docWidth = _$document.width(),
                docHeight = _$document.height(),
                lockMaskWrap = that._lockMaskWrap || $(document.body.appendChild(document.createElement('div'))),
                lockMask = that._lockMask || $(lockMaskWrap[0].appendChild(document.createElement('div'))),
                domTxt = '(document).documentElement',
                sizeCss = _isMobile ? 'width:' + docWidth + 'px;height:' + docHeight
                    + 'px' : 'width:100%;height:100%',
                ie6Css = _isIE6 ?
                    'position:absolute;left:expression(' + domTxt + '.scrollLeft);top:expression('
                    + domTxt + '.scrollTop);width:expression(' + domTxt
                    + '.clientWidth);height:expression(' + domTxt + '.clientHeight)'
                    : '';

            that.zIndex();
            wrap.addClass('aui_state_lock');

            lockMaskWrap[0].style.cssText = sizeCss + ';position:fixed;z-index:'
                + index + ';top:0;left:0;overflow:hidden;' + ie6Css;
            lockMask[0].style.cssText = 'height:100%;background:' + config.background
                + ';filter:alpha(opacity=0);opacity:0';

            // 让IE6锁屏遮罩能够盖住下拉控件
            if (_isIE6) lockMask.html(
                '<iframe src="about:blank" style="width:100%;height:100%;position:absolute;' +
                'top:0;left:0;z-index:-1;filter:alpha(opacity=0)"></iframe>');

            lockMask.stop();
            lockMask.bind('click', function () {
                that._reset();
            }).bind('dblclick', function () {
                that._click(that.config.cancelVal);
            });

            if (config.duration === 0) {
                lockMask.css({opacity: config.opacity});
            } else {
                lockMask.animate({opacity: config.opacity}, config.duration);
            }
            ;

            that._lockMaskWrap = lockMaskWrap;
            that._lockMask = lockMask;

            that._lock = true;
            return that;
        },

        /** 解开屏锁 */
        unlock: function () {
            var that = this,
                lockMaskWrap = that._lockMaskWrap,
                lockMask = that._lockMask;

            if (!that._lock) return that;
            var style = lockMaskWrap[0].style;
            var un = function () {
                if (_isIE6) {
                    style.removeExpression('width');
                    style.removeExpression('height');
                    style.removeExpression('left');
                    style.removeExpression('top');
                }
                ;
                style.cssText = 'display:none';

                _box && lockMaskWrap.remove();
            };

            lockMask.stop().unbind();
            that.DOM.wrap.removeClass('aui_state_lock');
            if (!that.config.duration) {// 取消动画，快速关闭
                un();
            } else {
                lockMask.animate({opacity: 0}, that.config.duration, un);
            }
            ;

            that._lock = false;
            return that;
        },

        // 获取元素
        _getDOM: function () {
            var wrap = document.createElement('div'),
                body = document.body;
            wrap.style.cssText = 'position:absolute;left:0;top:0';
            wrap.innerHTML = artDialog._templates;
            body.insertBefore(wrap, body.firstChild);

            var name, i = 0,
                DOM = {wrap: $(wrap)},
                els = wrap.getElementsByTagName('*'),
                elsLen = els.length;

            for (; i < elsLen; i++) {
                name = els[i].className.split('aui_')[1];
                if (name) DOM[name] = $(els[i]);
            }
            ;

            return DOM;
        },

        // px与%单位转换成数值 (百分比单位按照最大值换算)
        // 其他的单位返回原值
        _toNumber: function (thisValue, maxValue) {
            if (!thisValue && thisValue !== 0 || typeof thisValue === 'number') {
                return thisValue;
            }
            ;

            var last = thisValue.length - 1;
            if (thisValue.lastIndexOf('px') === last) {
                thisValue = parseInt(thisValue);
            } else if (thisValue.lastIndexOf('%') === last) {
                thisValue = parseInt(maxValue * thisValue.split('%')[0] / 100);
            }
            ;

            return thisValue;
        },

        // 让IE6 CSS支持PNG背景
        _ie6PngFix: _isIE6 ? function () {
            var i = 0, elem, png, pngPath, runtimeStyle,
                path = artDialog.defaults.path + '/skins/',
                list = this.DOM.wrap[0].getElementsByTagName('*');

            for (; i < list.length; i++) {
                elem = list[i];
                png = elem.currentStyle['png'];
                if (png) {
                    pngPath = path + png;
                    runtimeStyle = elem.runtimeStyle;
                    runtimeStyle.backgroundImage = 'none';
                    runtimeStyle.filter = "progid:DXImageTransform.Microsoft." +
                        "AlphaImageLoader(src='" + pngPath + "',sizingMethod='crop')";
                }
                ;
            }
            ;
        } : $.noop,

        // 强制覆盖IE6下拉控件
        _ie6SelectFix: _isIE6 ? function () {
            var $wrap = this.DOM.wrap,
                wrap = $wrap[0],
                expando = _expando + 'iframeMask',
                iframe = $wrap[expando],
                width = wrap.offsetWidth,
                height = wrap.offsetHeight;

            width = width + 'px';
            height = height + 'px';
            if (iframe) {
                iframe.style.width = width;
                iframe.style.height = height;
            } else {
                iframe = wrap.appendChild(document.createElement('iframe'));
                $wrap[expando] = iframe;
                iframe.src = 'about:blank';
                iframe.style.cssText = 'position:absolute;z-index:-1;left:0;top:0;'
                    + 'filter:alpha(opacity=0);width:' + width + ';height:' + height;
            }
            ;
        } : $.noop,

        // 解析HTML片段中自定义类型脚本，其this指向artDialog内部
        // <script type="text/dialog">/* [code] */</script>
        _runScript: function (elem) {
            var fun, i = 0, n = 0,
                tags = elem.getElementsByTagName('script'),
                length = tags.length,
                script = [];

            for (; i < length; i++) {
                if (tags[i].type === 'text/dialog') {
                    script[n] = tags[i].innerHTML;
                    n++;
                }
                ;
            }
            ;

            if (script.length) {
                script = script.join('');
                fun = new Function(script);
                fun.call(this);
            }
            ;
        },

        // 自动切换定位类型
        _autoPositionType: function () {
            this[this.config.fixed ? '_setFixed' : '_setAbsolute']();/////////////
        },


        // 设置静止定位
        // IE6 Fixed @see: http://www.planeart.cn/?p=877
        _setFixed: (function () {
            _isIE6 && $(function () {
                var bg = 'backgroundAttachment';
                if (_$html.css(bg) !== 'fixed' && $('body').css(bg) !== 'fixed') {
                    _$html.css({
                        zoom: 1,// 避免偶尔出现body背景图片异常的情况
                        backgroundImage: 'url(about:blank)',
                        backgroundAttachment: 'fixed'
                    });
                }
                ;
            });

            return function () {
                var $elem = this.DOM.wrap,
                    style = $elem[0].style;

                if (_isIE6) {
                    var left = parseInt($elem.css('left')),
                        top = parseInt($elem.css('top')),
                        sLeft = _$document.scrollLeft(),
                        sTop = _$document.scrollTop(),
                        txt = '(document.documentElement)';

                    this._setAbsolute();
                    style.setExpression('left', 'eval(' + txt + '.scrollLeft + '
                        + (left - sLeft) + ') + "px"');
                    style.setExpression('top', 'eval(' + txt + '.scrollTop + '
                        + (top - sTop) + ') + "px"');
                } else {
                    style.position = 'fixed';
                }
                ;
            };
        }()),

        // 设置绝对定位
        _setAbsolute: function () {
            var style = this.DOM.wrap[0].style;

            if (_isIE6) {
                style.removeExpression('left');
                style.removeExpression('top');
            }
            ;

            style.position = 'absolute';
        },

        // 按钮回调函数触发
        _click: function (name) {
            var that = this,
                fn = that._listeners[name] && that._listeners[name].callback;
            return typeof fn !== 'function' || fn.call(that, window) !== false ?
                that.close() : that;
        },

        // 重置位置与尺寸
        _reset: function (test) {
            var newSize,
                that = this,
                oldSize = that._winSize || _$window.width() * _$window.height(),
                elem = that._follow,
                width = that._width,
                height = that._height,
                left = that._left,
                top = that._top;

            if (test) {
                // IE6~7 window.onresize bug
                newSize = that._winSize = _$window.width() * _$window.height();
                if (oldSize === newSize) return;
            }
            ;

            if (width || height) that.size(width, height);

            if (elem) {
                that.follow(elem);
            } else if (left || top) {
                that.position(left, top);
            }
            ;
        },

        // 事件代理
        _addEvent: function () {
            var resizeTimer,
                that = this,
                config = that.config,
                isIE = 'CollectGarbage' in window,
                DOM = that.DOM;

            // 窗口调节事件
            that._winResize = function () {
                resizeTimer && clearTimeout(resizeTimer);
                resizeTimer = setTimeout(function () {
                    that._reset(isIE);
                }, 40);
            };
            _$window.bind('resize', that._winResize);

            // 监听点击
            DOM.wrap
                .bind('click', function (event) {
                    var target = event.target, callbackID;

                    if (target.disabled) return false; // IE BUG

                    if (target === DOM.close[0]) {
                        that._click(config.cancelVal);
                        return false;
                    } else {
                        callbackID = target[_expando + 'callback'];
                        callbackID && that._click(callbackID);
                    }
                    ;

                    that._ie6SelectFix();
                })
                .bind('mousedown', function () {
                    that.zIndex();
                });
        },

        // 卸载事件代理
        _removeEvent: function () {
            var that = this,
                DOM = that.DOM;

            DOM.wrap.unbind();
            _$window.unbind('resize', that._winResize);
        }

    };

    artDialog.fn._init.prototype = artDialog.fn;
    $.fn.dialog = $.fn.artDialog = function () {
        var config = arguments;
        this[this.live ? 'live' : 'bind']('click', function () {
            artDialog.apply(this, config);
            return false;
        });
        return this;
    };


    /** 最顶层的对话框API */
    artDialog.focus = null;


    /** 获取某对话框API */
    artDialog.get = function (id) {
        return id === undefined
            ? artDialog.list
            : artDialog.list[id];
    };

    artDialog.list = {};


// 全局快捷键
    _$document.bind('keydown', function (event) {
        var target = event.target,
            nodeName = target.nodeName,
            rinput = /^INPUT|TEXTAREA$/,
            api = artDialog.focus,
            keyCode = event.keyCode;

        if (!api || !api.config.esc || rinput.test(nodeName)) return;

        keyCode === 27 && api._click(api.config.cancelVal);
    });


// 获取artDialog路径
    _path = window['_artDialog_path'] || (function (script, i, me) {
            for (i in script) {
                // 如果通过第三方脚本加载器加载本文件，请保证文件名含有"artDialog"字符
                if (script[i].src && script[i].src.indexOf('artDialog') !== -1) me = script[i];
            }
            ;

            _thisScript = me || script[script.length - 1];
            me = _thisScript.src.replace(/\\/g, '/');
            return me.lastIndexOf('/') < 0 ? '.' : me.substring(0, me.lastIndexOf('/'));
        }(document.getElementsByTagName('script')));


// 无阻塞载入CSS (如"artDialog.js?skin=aero")
    _skin = _thisScript.src.split('skin=')[1];
    if (_skin) {
        var link = document.createElement('link');
        link.rel = 'stylesheet';
        link.href = _path + '/skins/' + _skin + '.css?' + artDialog.fn.version;
        _thisScript.parentNode.insertBefore(link, _thisScript);
    }
    ;


// 触发浏览器预先缓存背景图片
    _$window.bind('load', function () {
        setTimeout(function () {
            if (_count) return;
            artDialog({left: '-9999em', time: 9, fixed: false, lock: false, focus: false});
        }, 150);
    });


// 开启IE6 CSS背景图片缓存
    try {
        document.execCommand('BackgroundImageCache', false, true);
    } catch (e) {
    }
    ;


// 使用uglifyjs压缩能够预先处理"+"号合并字符串
// uglifyjs: http://marijnhaverbeke.nl/uglifyjs
    artDialog._templates =
        '<div class="aui_outer">'
        + '<table class="aui_border">'
        + '<tbody>'
        + '<tr>'
        + '<td class="aui_nw"></td>'
        + '<td class="aui_n"></td>'
        + '<td class="aui_ne"></td>'
        + '</tr>'
        + '<tr>'
        + '<td class="aui_w"></td>'
        + '<td class="aui_c">'
        + '<div class="aui_inner">'
        + '<table class="aui_dialog">'
        + '<tbody>'
        + '<tr>'
        + '<td colspan="2" class="aui_header">'
        + '<div class="aui_titleBar">'
        + '<div class="aui_title"></div>'
        + '<a class="aui_close" href="javascript:/*artDialog*/;">'
        + '\xd7'
        + '</a>'
        + '</div>'
        + '</td>'
        + '</tr>'
        + '<tr>'
        + '<td class="aui_icon">'
        + '<div class="aui_iconBg"></div>'
        + '</td>'
        + '<td class="aui_main">'
        + '<div class="aui_content"></div>'
        + '</td>'
        + '</tr>'
        + '<tr>'
        + '<td colspan="2" class="aui_footer">'
        + '<div class="aui_buttons"></div>'
        + '</td>'
        + '</tr>'
        + '</tbody>'
        + '</table>'
        + '</div>'
        + '</td>'
        + '<td class="aui_e"></td>'
        + '</tr>'
        + '<tr>'
        + '<td class="aui_sw"></td>'
        + '<td class="aui_s"></td>'
        + '<td class="aui_se"></td>'
        + '</tr>'
        + '</tbody>'
        + '</table>'
        + '</div>';


    /**
     * 默认配置
     */
    artDialog.defaults = {
        // 消息内容
        content: '<div class="aui_loading"><span>loading..</span></div>',
        title: '\u6d88\u606f',		// 标题. 默认'消息'
        button: null,				// 自定义按钮
        ok: null,					// 确定按钮回调函数
        cancel: null,				// 取消按钮回调函数
        init: null,					// 对话框初始化后执行的函数
        close: null,				// 对话框关闭前执行的函数
        okVal: '\u786E\u5B9A',		// 确定按钮文本. 默认'确定'
        cancelVal: '\u53D6\u6D88',	// 取消按钮文本. 默认'取消'
        width: 'auto',				// 内容宽度
        height: 'auto',				// 内容高度
        minWidth: 96,				// 最小宽度限制
        minHeight: 32,				// 最小高度限制
        padding: '20px 25px',		// 内容与边界填充距离
        skin: '',					// 皮肤名(预留接口,尚未实现)
        icon: null,					// 消息图标名称
        time: null,					// 自动关闭时间
        esc: true,					// 是否支持Esc键关闭
        focus: true,				// 是否支持对话框按钮自动聚焦
        show: true,					// 初始化后是否显示对话框
        follow: null,				// 跟随某元素(即让对话框在元素附近弹出)
        path: _path,				// artDialog路径
        lock: false,				// 是否锁屏
        background: '#000',			// 遮罩颜色
        opacity: .7,				// 遮罩透明度
        duration: 300,				// 遮罩透明度渐变动画速度
        fixed: false,				// 是否静止定位
        left: '50%',				// X轴坐标
        top: '38.2%',				// Y轴坐标
        zIndex: 1987,				// 对话框叠加高度值(重要：此值不能超过浏览器最大限制)
        resize: true,				// 是否允许用户调节尺寸
        drag: true					// 是否允许用户拖动位置

    };

    window.artDialog = $.dialog = $.artDialog = artDialog;
}(this.art || this.jQuery && (this.art = jQuery), this));


//------------------------------------------------
// 对话框模块-拖拽支持（可选外置模块）
//------------------------------------------------
;(function ($) {

    var _dragEvent, _use,
        _$window = $(window),
        _$document = $(document),
        _elem = document.documentElement,
        _isIE6 = !('minWidth' in _elem.style),
        _isLosecapture = 'onlosecapture' in _elem,
        _isSetCapture = 'setCapture' in _elem;

// 拖拽事件
    artDialog.dragEvent = function () {
        var that = this,
            proxy = function (name) {
                var fn = that[name];
                that[name] = function () {
                    return fn.apply(that, arguments);
                };
            };

        proxy('start');
        proxy('move');
        proxy('end');
    };

    artDialog.dragEvent.prototype = {

        // 开始拖拽
        onstart: $.noop,
        start: function (event) {
            _$document
                .bind('mousemove', this.move)
                .bind('mouseup', this.end);

            this._sClientX = event.clientX;
            this._sClientY = event.clientY;
            this.onstart(event.clientX, event.clientY);

            return false;
        },

        // 正在拖拽
        onmove: $.noop,
        move: function (event) {
            this._mClientX = event.clientX;
            this._mClientY = event.clientY;
            this.onmove(
                event.clientX - this._sClientX,
                event.clientY - this._sClientY
            );

            return false;
        },

        // 结束拖拽
        onend: $.noop,
        end: function (event) {
            _$document
                .unbind('mousemove', this.move)
                .unbind('mouseup', this.end);

            this.onend(event.clientX, event.clientY);
            return false;
        }

    };

    _use = function (event) {
        var limit, startWidth, startHeight, startLeft, startTop, isResize,
            api = artDialog.focus,
            //config = api.config,
            DOM = api.DOM,
            wrap = DOM.wrap,
            title = DOM.title,
            main = DOM.main;

        // 清除文本选择
        var clsSelect = 'getSelection' in window ? function () {
            window.getSelection().removeAllRanges();
        } : function () {
            try {
                document.selection.empty();
            } catch (e) {
            }
            ;
        };

        // 对话框准备拖动
        _dragEvent.onstart = function (x, y) {
            if (isResize) {
                startWidth = main[0].offsetWidth;
                startHeight = main[0].offsetHeight;
            } else {
                startLeft = wrap[0].offsetLeft;
                startTop = wrap[0].offsetTop;
            }
            ;

            _$document.bind('dblclick', _dragEvent.end);
            !_isIE6 && _isLosecapture ?
                title.bind('losecapture', _dragEvent.end) :
                _$window.bind('blur', _dragEvent.end);
            _isSetCapture && title[0].setCapture();

            wrap.addClass('aui_state_drag');
            api.focus();
        };

        // 对话框拖动进行中
        _dragEvent.onmove = function (x, y) {
            if (isResize) {
                var wrapStyle = wrap[0].style,
                    style = main[0].style,
                    width = x + startWidth,
                    height = y + startHeight;

                wrapStyle.width = 'auto';
                style.width = Math.max(0, width) + 'px';
                wrapStyle.width = wrap[0].offsetWidth + 'px';

                style.height = Math.max(0, height) + 'px';

            } else {
                var style = wrap[0].style,
                    left = Math.max(limit.minX, Math.min(limit.maxX, x + startLeft)),
                    top = Math.max(limit.minY, Math.min(limit.maxY, y + startTop));

                style.left = left + 'px';
                style.top = top + 'px';
            }
            ;

            clsSelect();
            api._ie6SelectFix();
        };

        // 对话框拖动结束
        _dragEvent.onend = function (x, y) {
            _$document.unbind('dblclick', _dragEvent.end);
            !_isIE6 && _isLosecapture ?
                title.unbind('losecapture', _dragEvent.end) :
                _$window.unbind('blur', _dragEvent.end);
            _isSetCapture && title[0].releaseCapture();

            _isIE6 && !api.closed && api._autoPositionType();

            wrap.removeClass('aui_state_drag');
        };

        isResize = event.target === DOM.se[0] ? true : false;
        limit = (function () {
            var maxX, maxY,
                wrap = api.DOM.wrap[0],
                fixed = wrap.style.position === 'fixed',
                ow = wrap.offsetWidth,
                oh = wrap.offsetHeight,
                ww = _$window.width(),
                wh = _$window.height(),
                dl = fixed ? 0 : _$document.scrollLeft(),
                dt = fixed ? 0 : _$document.scrollTop(),

                // 坐标最大值限制
                maxX = ww - ow + dl;
            maxY = wh - oh + dt;

            return {
                minX: dl,
                minY: dt,
                maxX: maxX,
                maxY: maxY
            };
        })();

        _dragEvent.start(event);
    };

// 代理 mousedown 事件触发对话框拖动
    _$document.bind('mousedown', function (event) {
        var api = artDialog.focus;
        if (!api) return;

        var target = event.target,
            config = api.config,
            DOM = api.DOM;

        if (config.drag !== false && target === DOM.title[0]
            || config.resize !== false && target === DOM.se[0]) {
            _dragEvent = _dragEvent || new artDialog.dragEvent();
            _use(event);
            return false;// 防止firefox与chrome滚屏
        }
        ;
    });

})(this.art || this.jQuery && (this.art = jQuery));

